import json

from channels.generic.websocket import AsyncWebsocketConsumer


# 用于主动推送分类更新
class CategoryConsumer(AsyncWebsocketConsumer):
    """
    分类更新 WebSocket 消费者
    功能：建立前端与后端的长连接，当分类数据变更时（新增/修改/删除），主动向前端推送通知
    依赖 Django Channels 库（需提前安装配置）
    """

    async def connect(self):
        """
        前端建立 WebSocket 连接时触发
        将当前连接加入“分类更新通知组”，便于后续批量推送
        """
        # 接收连接请求
        await self.accept()
        # 加入分类更新通知组（组名：category_updates）
        # 所有订阅分类更新的前端，都会加入这个组
        await self.channel_layer.group_add("category_updates", self.channel_name)

    async def disconnect(self, close_code):
        """
        前端断开 WebSocket 连接时触发
        将当前连接从通知组中移除，避免无效推送
        """
        await self.channel_layer.group_discard("category_updates", self.channel_name)

    async def category_updated(self, event):
        """
        接收后端分类变更事件，向前端推送更新通知
        event：包含变更信息的字典（如分类 ID、变更类型）
        """
        # 向前端发送JSON格式的通知消息
        await self.send(json.dumps({
            "type": "category.update",  # 消息类型(前端用于区分不同的通知)
            "message": "分类数据已更新，请刷新列表",  # 通知内容
            "category_id": event.get("category_id"),  # 变更的分类ID()
            "timestamp": json.dumps(event.get("timestamp"))  # 变更时间
        }))